package cn.com.dhcc.turbo.service.exch.cmdata;

import java.util.List;

import javax.xml.ws.WebServiceContext;

import cn.com.dhcc.app.core.util.Status;
import cn.com.dhcc.app.pub.core.consts.AppConst.ExchDataType;
import cn.com.dhcc.turbo.entity.api.Posthead;
import cn.com.dhcc.turbo.entity.exch.CmData;
import cn.com.dhcc.turbo.entity.exch.CrossNetTmpCmData;
import cn.com.dhcc.turbo.entity.exch.QueueMsgWrapper.ExchageLifecycle;
import cn.com.dhcc.turbo.entity.exch.SendCmData;

/**
 * 数据交换生命周期
 * 1、接收发送数据（多种形式:xml、文件、数据库数据）
 * 2、校验报文的合法性
 * 3、数据落地，将数据临时存储至本地仓库
 * 4、将数据发送至传输通道
 * 5、将数据从传输通道拿出来
 * 6、数据落地，将数据临时存储至本地仓库
 * 7、通知收信人数据到达
 * 8、通知发信人数据送达情况
 * 
 * 00数据传递的发送状态和路由信息的更新(贯穿于数据交换的整个生命周期)
 * 00发送异常的数据清理机制(独立于数据交换的生命周期)
 * 
 * 11跨网段数据导出
 * 22跨网段数据读取
 * 
 * 不同的传输类型生命周期不同:
 *  内网到外网:validate-localStore-waitCarvedDiscs-
 *  外网到内网:validate-localStore-sendDataToOuterSendPipeline-outerEntrepotStore
 *  同网段
 *     同节点传输(不跨网，不跨节点):validate-localStore-sendDataToLocalSys-outerGAP.....-remoteStore
 *     跨节点传输(不跨网，跨节点)：   validate-localStore-sendDataToPipline-remoteStore
 * 
 * 
 * 
 * 
 */
public interface CmDataExchangeLifecycle {
	/**
	 * 1、校验数据的合法性
	 * 2、校验数据发送者的权限(暂时不实现)
	 * @param posthead
	 * @param data
	 * @return
	 */
	public Status validate(String posthead, String data);

	/**
	 * 将数据进行本地仓库存储
	 * @param wsc
	 * @param posthead
	 * @param reqxml
	 * @param payload
	 * @return
	 */
	public Status localStore(WebServiceContext wsc, Posthead posthead, String reqxml, String payload,ExchDataType exchDataType,String metaData);
	
	
	/**
	 * 节点内的发送，即处理不需要进行跨节点传送的消息
	 * @return
	 */
	public Status sendDataToLocalSys();
	public Status waitCarvedDiscsCrossNet();
	/**
	 * 从内网到外网需要刻盘
	 * @return
	 */
	public Status waitCarvedDiscs();
	/**
	 * 从内网到外网需要刻盘
	 * @return
	 */
	public Status carvedDiscs(CmData cmData);
	
	/**
	 * 发送到外网网闸节点，或者中央节点
	 */
	public Status sendDataToOuterSendPipeline();
	
	public Status outerEntrepotStore(SendCmData sendCmData);
	
	/**
	 * 定时任务，将文件发送至外网网闸的FTP目录
	 * @return
	 */
	public Status outerGAP();
	public Status  innerEntrepotStore();
	/**
	 * 将数据发送至传输管道(需要跨节点发送的数据)
	 * @return
	 */
	public Status sendDataToPipline();

	/**
	 * 将数据进行远端仓库存储
	 * @param cmData
	 * @param payload
	 * @return
	 */
	public Status remoteStore(SendCmData cmData);
	
	
	public Status processUploadFile();  

	/**
	 * 通知收信人
	 * 1、对于常规数据和数据库数据，直接将消息发送给对方
	 * 2、对于大文件，只通知对方文件已经到达，需要对方自己到FTP服务器获取文件
	 * @param data
	 * @return
	 */
	public Status notifyReceiver();

	/**
	 * 通知发信人
	 * @param fromSys
	 * @param message
	 * @return
	 */
	public Status notifySender();

    /**
     *  通过tlq更新路由和状态信息
	 * 注意，这个操作散布在上述几个生命中期之中
     * @param cmData 发送的数据
     * @param fromCode from的节点编码
     * @param toCode  to的节点编码  
     * @param exchageLifecycle
     * @return
     * 注意fromCode和toCode不一定是cmdata中的fromcode,tocode
     */
	public Status feedbackSendStatusAndRoutelog(CmData cmData,String toCode,ExchageLifecycle exLifecycle);

	/**通过tlq更新通知状态和路由
	 * 将信息投递通知结果反馈给目的节点(这是最后一个生命周期)
	 * @param cmData
	 * @return
	 */
	public Status feedbackNotifyStatusAndRoutelog(SendCmData cmData,String toCode,ExchageLifecycle exLifecycle);

	/**
	 * 更新本级节点的路由日志
	 * 注意，这个操作散布在上述几个生命中期之中
	 * @param cmData
	 * @return
	 */
	public Status updateSendStatusAndRoutelog(SendCmData cmData);

	/**
	 * 更新本级节点的路由日志
	 * 注意，这个操作散布在上述几个生命中期之中
	 * @param cmData
	 * @return
	 */
	public Status updateSendStatusAndRoutelog(CrossNetTmpCmData cmData);
	/**
	 * 更新本级节点的路由日志
	 * 注意，这个操作散布在上述几个生命中期之中
	 * @param cmData
	 * @return
	 */
	public Status updateNotifyStatusAndRoutelog(CrossNetTmpCmData cmData);

	/**
	 * 更新本级节点的反馈结构（最后一个生命周期）
	 * @param cmData
	 * @return
	 */
	public Status updateNotifyStatusAndRoutelog(SendCmData cmData);

	/**
	 * 更新数据传递的发送状态和路由信息
	 * 注意，这个操作散布在上述几个生命中期之中
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public Status updateSendStatus(List dataList, String status, Class clazz);

	/**
	 * 消息清除，
	 * 说明：当某些情况下(如服务器突然断电)，消息状态可能会停顿在发送状态，对这些半死不活的消息需要进行一个定期的清理
	 */
	public Status cleanUp();
}
